﻿// Пример иллюстрирует использование знака "&" для явного указания шаблонного типа подпрограммы

function GetDefault<T>: T :=
default(T);

type
  GenericType<T> = class
    constructor := exit;
    static procedure p1 := writeln(typeof(T));
  end;

begin
  
//  var o := GetDefault<byte>; //Ошибка: Встречено ';', а ожидалось выражение
  // компилятор не отличает знак сравнения < от открытия угловой скобки
  // и поэтому видит эту строчку как "(GetDefault < byte) > ;"
  // ";" там оказывается неожиданно, потому что компилятор ожидал ещё какое то выражение для сравнения
  
  // но, знаком "&" можно экранировать "<"
  // то есть переключить значение "<" со знака сравнения на открывающуюся скобочку:
  var o := GetDefault&<byte>;
  
  // в случае с шаблонными типами - обычно "&" не нужен
  var a := new GenericType<word>;
  
  // однако для вызова статичного метода - его так же надо поставить
  GenericType&<real>.p1;
  
end.